/**
 * 发放奖励
 */
const addReward = async function(data) {
	let res = { code: 0, msg: "" };
	let {
		taskInfo, //  任务信息
		orderInfo, // 订单信息
		userInfo, // 下单人信息
		mchInfo, // 商家配置信息
		usersRewardList, // 用户奖励列表
	} = data;
	let { order_no } = orderInfo;

	/**
	 * 给每个人发放对应的奖励（冻结）
	 * 最后将该任务标记为已完成
	 */
	let time = Date.now();
	// 设置解锁时间，这个时间可以在规则管理里设置
	let reward_lock_day = vk.pubfn.getData(mchInfo, "fx.reward_lock_day", 8); // 0代表不冻结，1代表当天，2代表明天，以此类推
	let { todayStart } = vk.pubfn.getCommonTime(time);
	let unfreeze_time = vk.pubfn.getOffsetTime(todayStart, {
		day: reward_lock_day,
		mode: "after", // after 之后 before 之前
	});

	// 开启事务
	const transaction = await vk.baseDao.startTransaction();
	try {
		// 添加奖励开始-----------------------------------------------------------
		for (let i = 0; i < usersRewardList.length; i++) {
			let usersRewardItem = usersRewardList[i];
			let titleLabel = "";
			if (usersRewardItem.reward_name) titleLabel = `【${usersRewardItem.reward_name}】`;
			// 添加待提现余额 和 收支记录
			await vk.daoCenter.moneyDao.updateAccountWaitRewardForTransaction({
				db: transaction,
				user_id: usersRewardItem.user_id,
				value: usersRewardItem.reward_value,
				isAdd: true,
				updateTotal: true,
				no: order_no,
				title: `${titleLabel}奖励收入，来自客户：${userInfo.nickname}`,
				comment: ``,
				add_type: 7, // 1 人工录入 2 用户线上充值 3 消费 4 退款 5 转账 6 余额转换 7 奖励发放 8 解锁 9 提现 10 提现拒绝后返还
				reward_type: usersRewardItem.reward_type,
				reward_type_lv: usersRewardItem.reward_type_lv,
				calc_rule: usersRewardItem.calc_rule,
				goods_reward_list: usersRewardItem.goods_reward_list,
			});
		}
		// 添加奖励结束-----------------------------------------------------------

		// 添加商品业绩

		await vk.daoCenter.userGoodsPerDao.addByOrder({
			db: transaction,
			orderInfo,
			userInfo
		});
		// 标记订单返佣完毕
		await vk.daoCenter.orderDao.updateById({
			db: transaction,
			id: orderInfo._id,
			dataJson: {
				"inviter_uid": userInfo.inviter_uid,
				"fx.settlement_status": 1,
				"fx.settlement_time": time,
			}
		});

		// 标记任务执行完毕
		await vk.daoCenter.orderTaskDao.updateStatusSuccess({
			db: transaction,
			taskInfo
		});

		// 提交事务
		await transaction.commit();
		console.log(`transaction succeeded`);
		res.msg = "ok";
		res.code = 0;
		res.taskInfo = taskInfo;
	} catch (err) {
		// 事务回滚
		return await vk.baseDao.rollbackTransaction({
			db: transaction,
			err
		});
	}

	return res;
};

module.exports = addReward;
